package com.lingjtx.common.thread.pooling;

import com.lingjtx.common.core.constant.Const;
import jakarta.mail.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Properties;

public class MailConnectionFactory implements ObjectFactory<Session> {

    private static final Logger log = LoggerFactory.getLogger(MailConnectionFactory.class);

    @Override
    public Session create() {
        // 创建邮件会话（用于SMTP、IMAP等）
        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");// 连接协议
        props.put("mail.smtp.host", Const.EMAIL_HOST);// 主机名
        props.put("mail.smtp.port", Const.EMAIL_PORT);// 端口号
        props.put("mail.smtp.auth", "true");
        props.put(Const.EMAIL_ENABLE, "true");// 设置是否使用ssl安全连接 ---一般都使用
        props.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息

        return Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(Const.EMAIL_SENDER, Const.EMAIL_PASSWORD);
            }
        });
    }

    // 验证邮件会话是否有效
    @Override
    public boolean validate(Session obj) {
        if (obj == null) return false;
        try {
            // 验证会话的 SMTP 连接是否正常
            Transport transport = obj.getTransport();
            transport.connect();
            return transport.isConnected();
        } catch (NoSuchProviderException e) {
            // 邮件协议无效
            log.error("邮件协议无效：异常：{}", e.getMessage());
            return false;
        } catch (MessagingException e) {
            // 其他邮件连接错误
            log.error("其他邮件连接错误：{}", e.getMessage());
            return false;
        }
    }

    // 销毁邮件会话
    @Override
    public void destroy(Session obj) {
        if (obj != null) {
            try {
                // 如果你希望销毁相关的邮件传输连接，可以选择关闭传输通道
                Transport transport = obj.getTransport();
                if (transport.isConnected()) {
                    transport.close(); // 关闭连接
                }
            } catch (MessagingException e) {
                // 销毁时发生的异常，通常不需要抛出
                log.error("销毁时发生的异常：{}", e.getMessage());
            }
        }
    }

    @Override
    public void shutdown() {
        // 这里可以加入关闭连接池时的清理逻辑
    }
}